package com.xinyue.design.decorator;

/**装饰器模式说明
 * 装饰模式的定义是：动态的给一个对象添加一些新的职责，就增加功能来说，装饰模式比生成子类更为灵活。
 * 装饰器模式的精髓是：
 * 1、动态的增加方法。
 * 2、方法间的排列组合。
 * <精髓说明begin>
 * 装饰器模式就来源于工业生产中的流水线模式。原材料从入口进入，根据不同的加工车间生产出不同的产品。各个加工车间就是一个具体的装饰器。
 * 他们彼此不知道对方的存在（解耦），可以动态增加、组合。也不存在具体的加工顺序，非常灵活。
 * <精髓说明end>
 * 装饰模式的优点是：装饰类和被装饰类可以独立发展，而不会相互耦合，就是说被装饰者可以不用知道装饰类的存在。
 * 装饰者也不用知道被装饰着的具体实现。只需要再被装饰者上进行一些功能的扩展和延伸就可以了。
 * 装饰模式是继承关系的一种替代方案
 * 它的缺点是会让程序的调试变得复杂。
 * 
 * 使用装饰器模式的基本要素：
 * 1、装饰器是步进式操作。
 * 	     就是说所要装饰的方法一般都是分步骤的操作方法。先干什么，再干什么，然后干什么这个模式。
 * 2、装饰器所要装饰的方法在需求上实现多变，不同的需求有不同的方法和方法组合。
 * 	  就是说完成这个功能的方法根据不同的条件，分为多种计算方法。且计算方式复杂，需要分解为多个步骤。
 */

/**
 * 装饰父类：
 * 在进一步定义装饰器之前，先定义出各个装饰器公共的父类，在这里定义所有装饰器对象需要实现的方法。
 * 这个父类应该实现组件的接口，这样才能保证装饰后的对象仍然可以继续被装饰。实现动态组合的目的。
 * 
 * 说明：实现各个装饰者之间最好是不要有先后顺序的限制，  也就是先装饰谁和后装饰谁都应该是一样的。
 */
public abstract class BonusDecorator extends Bonus{

	/**
	 * 持有被装饰的组件对象
	 */
	protected Bonus bonus;
	
	/**
	 * 通过构造方法传入被装饰的对象
	 * 保证装饰后的对象仍然可以继续被装饰。
	 */
	public BonusDecorator(Bonus bonus) {
		this.bonus = bonus;
	}
	
	//计算奖金额度
	public double computeBonus(double salary) {
		//转调组件对象的方法
		return bonus.computeBonus(salary);
	};
}
